package Modelo.Evento;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import Util.ExcecaoInstanciaNaoEncontrada;

public class EventoDao {
	public EventoDao() {
		super();
	}
	public Evento adicionarEvento(Connection connection,Evento evento){
		/* Criar "queryString". 
		 * Interrogacoes serao os parametros passados ao objeto
		 * preparedStatement*/
		String queryString = "INSERT INTO Evento"
				+ " ( tituloEvento, descricaoEvento, siteEvento) VALUES (?, ?, ?)";
		//Objeto que ira enviar a querrystring ao banco de dados e 
		//criara as chaves primarias
		try (PreparedStatement preparedStatement = connection.prepareStatement(
				queryString, Statement.RETURN_GENERATED_KEYS)) {

			int i = 1;
			int insertedRows = 0;
			//Coloca os parametros na mesma ordem indicada na querrystring
			preparedStatement.setString(i++, evento.getTituloEvento());
			preparedStatement.setString(i++, evento.getDescricaoEvento());
			preparedStatement.setString(i++, evento.getSiteEvento());
			insertedRows = preparedStatement.executeUpdate(); //Executa o comando SQL

			if (insertedRows == 0) {
				throw new SQLException("Can not add row to table 'PessoaIntern'");
			}

			if (insertedRows > 1) {
				throw new SQLException("Duplicate row in table 'PessoaIntern'");
			}

			/* Pega a chave primaria. */
			ResultSet resultSet = preparedStatement.getGeneratedKeys();

			if (!resultSet.next()) {
				throw new SQLException(
						"JDBC driver did not return generated key.");
			}
			Long codEvento = new Long(resultSet.getLong(1));

			return new Evento(codEvento, evento.getTituloEvento(), evento.getDescricaoEvento(), 
					evento.getSiteEvento());
			
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public Evento buscarEvento(Connection connection, Long codEvento)
			throws ExcecaoInstanciaNaoEncontrada{
		
		
		String queryString = "SELECT tituloEvento, descricaoEvento,"
				+ "siteEvento FROM Evento WHERE codEvento = ?";
		
		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {

			int i = 1;
			preparedStatement.setLong(i++, codEvento);
			//Pega os Resultados da busca
			ResultSet resultSet = preparedStatement.executeQuery();

			if(!resultSet.next()){
				throw new ExcecaoInstanciaNaoEncontrada(codEvento, "Evento");

			}
			
			i = 1;
			String tituloEvento = resultSet.getString(i++);
			String descricaoEvento = resultSet.getString(i++);
			String siteEvento = resultSet.getString(i++);
			return new Evento(codEvento, tituloEvento, descricaoEvento, siteEvento);


		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public void removerEvento(Connection connection, long codEvento)
			throws ExcecaoInstanciaNaoEncontrada{
		String queryString = "DELETE FROM Evento WHERE codEvento = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			int i = 1;
			preparedStatement.setLong(i++, codEvento);

			int removedRows = preparedStatement.executeUpdate();

			if(removedRows == 0){
				throw new ExcecaoInstanciaNaoEncontrada(codEvento, "Evento");
			}

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
	public void updateEvento(Connection connection, Evento evento) 
			throws ExcecaoInstanciaNaoEncontrada {

		int updateRows = 0;

		String queryString = "UPDATE Evento "
				+ "SET tituloEvento = ?, descricaoEvento = ?, siteEvento = ?" +
				" WHERE codEvento = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)){
			int i = 1;
			preparedStatement.setString(i++, evento.getTituloEvento());
			preparedStatement.setString(i++, evento.getDescricaoEvento());
			preparedStatement.setString(i++, evento.getSiteEvento());
			System.out.println(evento.getCodEvento());
			preparedStatement.setLong(i++, evento.getCodEvento());
			updateRows = preparedStatement.executeUpdate();

			if(updateRows == 0){
				throw new ExcecaoInstanciaNaoEncontrada(evento.getCodEvento(), "Evento");
			}

			else if(updateRows > 1){
				throw new SQLException("Linha duplicada para o identificador = '" + "' "
						+ "na tabela 'Evento'");
			}


		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public List<Evento> buscarTodosEventos(Connection connection) {

		String queryString = "SELECT * FROM Evento";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {

			ResultSet resultSet = preparedStatement.executeQuery();
			List<Evento> eventos = new ArrayList<Evento>();

			while(resultSet.next()){
				int i = 1;
				Long codEvento = resultSet.getLong(i++);
				String tituloEvento = resultSet.getString(i++);
				String descricaoEvento = resultSet.getString(i++);
				String siteEvento = resultSet.getString(i++);
				eventos.add(new Evento(codEvento, tituloEvento, descricaoEvento, siteEvento));
			}
			return eventos;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
